// app/vendor/quotations/page.tsx import * as React from "react"; import Link from "next/link"; import { Metadata } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { LogIn } from "lucide-react"; import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"; import { Shell } from "@/components/shell"; import { getValidFilters } from "@/lib/data-table"; import { type SearchParams } from "@/types/table"; import { searchParamsVendorRfqCache } from "@/lib/rfq-last/vendor-response/validations"; import { InformationButton } from "@/components/information/information-button" import { getVendorQuotationsLast,getQuotationStatusCountsLast } from "@/lib/rfq-last/vendor-response/service"; import { VendorQuotationsTableLast } from "@/lib/rfq-last/vendor-response/vendor-quotations-table"; import { useTranslation } from "@/i18n" export const metadata: Metadata = { title: "견적 목록", description: "진행 중인 견적서 목록", }; interface IndexPageProps { params: Promise<{ lng: string }> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const { lng } = await props.params; const { t } = await useTranslation(lng, 'menu') const searchParams = await props.searchParams const search = searchParamsVendorRfqCache.parse(searchParams) const validFilters = getValidFilters(search.filters) // 인증 확인 const session = await getServerSession(authOptions); // 로그인 확인 if (!session || !session.user) { return (

{t('menu.vendor.procurement.rfq_response')}

{/*

진행 중인 견적서 목록을 확인하고 관리합니다.

*/}

로그인이 필요합니다

견적서를 확인하려면 먼저 로그인하세요.

); } // 벤더 ID 확인 const vendorId = session.user.companyId ? String(session.user.companyId) : "0"; // 벤더 권한 확인 if (session.user.domain !== "partners") { return (

접근 권한 없음

벤더 계정이 필요합니다

벤더 계정으로 로그인해주세요.

); } // 데이터 가져오기 const quotationsPromise = getVendorQuotationsLast({ ...search, filters: validFilters }, vendorId); // 상태별 개수 가져오기 const statusCountsPromise = getQuotationStatusCountsLast(vendorId); // 모든 프로미스 병렬 실행 const promises = Promise.all([quotationsPromise]); const statusCounts = await statusCountsPromise; return (

{t('menu.vendor.procurement.rfq_response')}

{t('menu.vendor.procurement.rfq_response_desc')}

전체 견적
{Object.values(statusCounts).reduce((sum, count) => sum + count, 0)}건
응답 대기
{statusCounts["미응답"] || 0}건
작성 중
{statusCounts["작성중"] || 0}건
제출 완료
{(statusCounts["제출완료"] || 0) + (statusCounts["최종확정"] || 0)}건
불참
{statusCounts["불참"] || 0}건
} >
); }